package fr.peltier.nicolas.robot.ai.activites;

import net.engio.mbassy.bus.MBassador;
import net.engio.mbassy.listener.Handler;
import fr.peltier.nicolas.robot.ai.decisionnel.Contexte;
import fr.peltier.nicolas.robot.ai.memoire.ReconnaissanceFaciale;
import fr.peltier.nicolas.robot.ai.systemenerveux.event.ParoleEvent;
import fr.peltier.nicolas.robot.ai.systemenerveux.event.ReconnaissanceVocaleEvent;
import fr.peltier.nicolas.robot.ai.systemenerveux.event.RobotEvent;
import fr.peltier.nicolas.robot.ai.systemenerveux.event.VisagesEvent;

/**
 * Classe abstraite représentant une activité.
 * @author Nicolas Peltier (nico.peltier@gmail.com)
 */
public abstract class AbstractActivite {
    
    /** Système nerveux (bus d'évènements). */
    protected MBassador<RobotEvent> systemeNerveux;
    
    /** Contexte du robot. */
    protected Contexte contexte;
    
    /** Reconnaissance faciale. */
    // TODO Utiliser plutôt la mémoire pour accéder à la reconnaissance
    protected ReconnaissanceFaciale reconnaissanceFaciale;
    
    /**
     * Constructeur.
     * @param systemeNerveux le système nerveux
     */
    public AbstractActivite(MBassador<RobotEvent> systemeNerveux, Contexte contexte, ReconnaissanceFaciale reconnaissanceFaciale) {
        this.systemeNerveux = systemeNerveux;
        this.contexte = contexte;
        this.reconnaissanceFaciale = reconnaissanceFaciale;
    }
    
    /**
     * Initialise l'activité avant activation des écouteurs d'évènements.
     * Permet, par exemple, de charger des données, initialiser des valeurs, ...
     */
    public abstract void initialiser();
    
    /**
     * Intercepte les évènements de détection de visages.
     * @param visagesEvent évènement de détection de visages
     */
    @Handler
    public abstract void handleVisagesEvent(VisagesEvent visagesEvent);
    
    /**
     * Intercepte les évènements de reconnaissance vocale.
     * @param reconnaissanceVocaleEvent évènement de reconnaissance vocale
     */
    @Handler
    public abstract void handleReconnaissanceVocalEvent(ReconnaissanceVocaleEvent reconnaissanceVocaleEvent);
    
    /**
     * Arrête l'activité.
     * Permet au robot d'arrêter proprement l'activité (sauvegarde de données, ...)
     */
    public abstract void arreter();
    
    /**
     * Envoie un évènement pour dire du texte.
     * @param texte le texte à dire
     */
    public void dire(String texte) {
        final ParoleEvent paroleEvent = new ParoleEvent();
        paroleEvent.setTexte(texte);
        systemeNerveux.publish(paroleEvent);
    }

}
